<template>
  <!-- 组件的结构。其中template标签是不参与结构编译的 -->
  <div class="demo">
    <h2>学生名称：{{ name }}</h2>
    <h2>学生年龄：{{ age }}</h2>
    <h2>number值：{{ number }}</h2>
    <button @click="add">点我number++</button>
    <button @click="sendStudentName">把学生姓名给App</button>
    <button @click="unbind">解绑atguigu事件</button>
    <button @click="death">销毁当前Student组件的实例</button>
    <hr>
  </div>
</template>

<script>
// 组件交互相关的代码（数据、方法等等）。

// // 暴漏方式一：分别暴露
// export const student = Vue.extend({
//   data() {
//     return {
//       student: {
//         name: '尚硅谷',
//         age: '北京市昌平区宏福科技园',
//       }
//     }
//   },
//   methods: {
//     showName() {
//       alert(this.student.name);
//     }
//   }
// });


// const student = Vue.extend({
//   data() {
//     return {
//       student: {
//         name: '尚硅谷',
//         age: '北京市昌平区宏福科技园',
//       }
//     }
//   },
//   methods: {
//     showName() {
//       alert(this.student.name);
//     }
//   }
// });
// 暴漏方式二：统一暴露
// export {student};


// 暴露方式三：默认暴露
// export default {student};
// 如果是暴露出一个对象的话，就直接省略花括号{}
// export default student;


// 直接使用默认暴露的话，可以省略 student 变量定义
// export default Vue.extend({
//   data() {
//     return {
//       student: {
//         name: '尚硅谷',
//         age: '北京市昌平区宏福科技园',
//       }
//     }
//   },
//   methods: {
//     showName() {
//       alert(this.student.name);
//     }
//   }
// });

// 其中可以省略Vue.extend()
export default {
  name: 'Student', // 定义默认的组件名称，最好和组件的名称保持一致性
  data() {
    return {
      msg: '我是尚硅谷的一个学习Vue的学生！',
      // 通过外部传参的形式获取到真实的数据
      name: '张飒飒',
      age: 18,
      number: 0,
    }
  },
  methods: {
    add() {
      this.number++;
    },
    sendStudentName() {
      // 使用$emit 触发Student 组件实例身上的atguigu事件
      this.$emit('atguigu', this.name, 666, 888, 999);
      // // 验证触发自定义事件的功能
      // this.$emit('demo');
    },
    // 解绑自定义事件，如果不再使用该自定义事件的时候
    unbind() {
      this.$off('atguigu'); // 此种写法只适用于解绑一个自定义事件
      // this.$off(['atguigu', 'demo']); // 此种写法适用于解绑多个自定义事件
    },
    death() {
      this.$destroy(); // 销毁了当前Student 组件的实例。销毁后所有Student实例的自定义事件全部不奏效了。
    }
  }
};
</script>

<!--
## scoped样式
1. 作用：让样式在局部生效，防止冲突。
2. 写法：```<style scoped>```
-->
<!-- 不写lang 的话，默认就是css -->
<style scoped lang="less">
/* 组件的样式 */
.demo {
  background: orange;
  padding: 5px;
  margin-top: 30px;
}
</style>


